package com.itheima.userdemo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

//@WebFilter("/*")
public class LoginFilter implements Filter {
    List<String> noLoginPath = new ArrayList<>();
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LoginFilter init...");
        // 以下访问路径不需要登录就可以访问的
        noLoginPath.add("/login.jsp");
        noLoginPath.add("/register.jsp");
        noLoginPath.add("/loginServlet");
        noLoginPath.add("/regServlet");
        noLoginPath.add("/checkCodeServlet");
        noLoginPath.add("/css/");
        noLoginPath.add("/imgs/");

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("LoginFilter doFilter...start");
        // chain.doFilter(request,response);
        // 1. 确定哪些资源是不需要检查是否登录，如果是放行
           // 如果判断当前请求路径，是需要放行的，或哪些资源路径是不需要登录就可以访问的
           // 获取当前访问的路径，看看是否在noLoginPath列表中，如果在就放行
        HttpServletRequest req = (HttpServletRequest)request;
        // 当前访问路径
        String requestURI = req.getRequestURI();
        //  /userdemo/login.jsp
        System.out.println("当前访问路径:"+requestURI);
        // /userdemo/index.jsp，这个时候for有匹配吗
        boolean isMatch = false;
        for (String path:noLoginPath){
            // /userdemo/login.jsp 包含了遍历的每个路径，不能equals,用包含
            if(requestURI.contains(path)){
                // 匹配到资源
                isMatch = true;
            }
        }
        if(isMatch){
            // 匹配到就放行
            chain.doFilter(request,response);
            return;
        }
        // /userdemo/index.jsp,如果没有登录，返回的Object是什么类型的
        // 去Session看看，如果有用户名存在不，如果存在就放行，不存在，执行后面的逻辑
        // /login.jsp /register.jsp
        // 如果登录过了，我们就需要去检查Session
        // 2. 如果需要检查，我们如何检查（检查Session里面是否存放了登录之后的用户名)
        // 3. 根据判断，确定是否放行
        Object username = req.getSession().getAttribute("username");
        if(username != null){
            // 如果有，就放行
            chain.doFilter(request,response);
        }else{
            // 其他情况，转发登录
            req.getRequestDispatcher("/login.jsp").forward(request,response);
        }
        System.out.println("LoginFilter doFilter...end");
    }

    @Override
    public void destroy() {
        System.out.println("LoginFilter doFilter...destroy");
    }
}
